package park;

import java.io.ObjectInputStream.GetField;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;

import park.model.SungJuk2VO;

public class J20SungJuk {
	
	//숫자를 특정형식에 맞춰 출력하는 도우미 클래스
	//NumberFormat
	//DecimalFormat는 format 메서드에 특정패턴(0,#)을 이용해서 다양한 형식으로 숫자를 출력할 수 있음

	public static void main(String[] args) {

		ArrayList<SungJuk2VO> mdb = new ArrayList<>();
		String dfmt1 = "000.00";
		String dfmt2 = "###.##";
		String hr = "--------------------------------------";
		String newMsg1 = "새로운 성적데이터를 입력합니다";
		String newMsg2 = "이름 국어 영어 수학순으로 입력하세요";
		String newMsg3 = "성적 등록 완료!";
		String newMsg4 = "성적 등록 실패! - 숫자만 입력하세요";
		String newMsg5 = "성적 등록 실패! - 알수없는 오류발생!";
		
		String readMsg1 = "전체 성적데이터 출력";
		String readMsg2 = "검색할 성적 데이터의 이름을 입력하세요";
		String readMsg3 = "데이터를 찾았습니다";
		String readMsg4 = "찾는 데이터가 없습니다";
		
		String modifyMsg1 = "기존 성적 데이터를 수정합니다";
		String modifyMsg2 = "수정할 데이터의 이름을 입력하세요";
		String modifyMsg3 = "이름 국어 영어 수학 순으로 입력하세요";
		String modifyMsg4 = "수정 결과는 다음과 같습니다";
		String modifyMsg5 = "찾는 데이터가 없어요";
		
		String removeMsg1 = "특정 성적 데이터를 삭제합니다";
		String removeMsg2 = "삭제할 데이터의 이름을 입력하세요";
		String removeMsg3 = "성공적으로 삭제되었습니다";
		String removeMsg4 = "삭제할 데이터를 찾지 못했습니다";
	
		
		

		// 성적 데이터 입력 create

		Scanner sc = new Scanner(System.in);

		SungJuk2VO sj = null;
		System.out.println(newMsg1);
		System.out.println(newMsg2);

		// 입력하는 부분부터 출력하는 부분까지 트라이 케치로 잡아야함
		try {

			String name = sc.next();
			int kor = sc.nextInt();
			int eng = sc.nextInt();
			int mat = sc.nextInt();

			sj = new SungJuk2VO(name, kor, eng, mat); // 위에 값을 저장
			
			sj.setTot(sj.getKor() + sj.getEng() + sj.getMat());
			
			DecimalFormat df = new DecimalFormat(dfmt1); //소수점자리 컷
			String avg = df.format((double)sj.getTot()/3);
			sj.setAvg(Double.parseDouble(avg));
			
			//sj.setAvg((double)sj.getTot()/3);
			
			//스위치문에는 인트랑 스트링형만 들어감
			switch((int)sj.getAvg()/10){
				
				case 10 : 
				case 9 : sj.setGrd('수');break; 
				case 8 : sj.setGrd('우');break; 
				case 7 : sj.setGrd('미');break; 
				case 6 : sj.setGrd('양');break; 
				default :sj.setGrd('가');
				
			}
			
			System.out.println(newMsg3);
			
			mdb.add(sj); //arraylist에 데이터 추가!

		} catch (InputMismatchException ime) {
			sj = null; 	//객체 제거
			System.out.println(newMsg4);
		} catch (Exception ex) {
			sj = null;	//객체 제거
			ex.printStackTrace(); //자세한 오류내용 출력
			System.out.println(newMsg5);
		}
		
		System.out.println(hr);
		
		
		// VO클래스는 값만저장
		// 성적 데이터 조회 retrieve
		
		System.out.println(readMsg1);
		StringBuilder sb = new StringBuilder();
		
		//for each문 중요!
		for(SungJuk2VO s : mdb){
			sb.append(s.toString()).append("\n");
		}
		
		System.out.println(sb);
		System.out.println(hr);
		
		// 성적 데이터 검색
		//어렵다!
		System.out.println(readMsg2);
		String key = sc.next(); //이름 입력받음
		SungJuk2VO findOne = null;
		
		for(SungJuk2VO s :mdb){
			if(s.getName().contains(key)){ //contains , equls이랑 같음 
				findOne = s; //검색된 데이터를 findOne에 저장
				break;
			}//if
		}//for
		if(findOne != null){
			System.out.println(readMsg3);
			System.out.println(findOne);
		}else{
			System.out.println(readMsg4);
		}
		System.out.println(hr);
		
		// 성적 데이터 수정 update
		
		System.out.println(modifyMsg1);
		System.out.println(modifyMsg2);
		key = sc.next();
		
		findOne = null;	  //수정할 데이터
		int position = 0; //검색한 데이터의 위치
		for(SungJuk2VO s : mdb){
		//if(s.getName() == key ){ 이거는 객체기때문에 안됨
			if(s.getName().equals(key)){
				findOne = s; break;
			}//if
			
			++position;
			
		}//for
		
		if(findOne != null){
			System.out.println(findOne);
			System.out.println(modifyMsg3);
			findOne = new SungJuk2VO(sc.next(), sc.nextInt(),sc.nextInt(),sc.nextInt());
			findOne.setTot(findOne.getKor() + findOne.getEng() + findOne.getMat());
			
			DecimalFormat df = new DecimalFormat(dfmt1); //소수점자리 컷
			String avg = df.format((double)findOne.getTot()/3);
			findOne.setAvg(Double.parseDouble(avg));
			
			//findOne.setAvg((double)findOne.getTot()/3);
			
			//스위치문에는 인트랑 스트링형만 들어감
			switch((int)findOne.getAvg()/10){
			
				case 10 : 
				case 9 : findOne.setGrd('수');break; 
				case 8 : findOne.setGrd('우');break; 
				case 7 : findOne.setGrd('미');break; 
				case 6 : findOne.setGrd('양');break; 
				default :findOne.setGrd('가');
				
			}
			
			//수정된 입력값들을 arraylist mdb에 반영
			mdb.set(position,findOne);
			
			System.out.println(modifyMsg4);
			System.out.println(mdb.get(position));
			
		}else{
			System.out.println(modifyMsg5);
		}
		System.out.println(hr);
		
		// 성적 데이터 삭제 delete
		
		System.out.println(removeMsg1);
		System.out.println(removeMsg2);
		key = sc.next();
		
		boolean findOk = false;
		position = 0;	
		for(int i = 0; i < mdb.size(); ++i){ //mdb.size(); mdb에 있는 데이터를 다 돌린다는 뜻.
			SungJuk2VO s = mdb.get(i); 
			if(s.getName().equals(key)){
				findOk = true;
				position = i; //i를 지정해서 찾아주지 않으면 제일 첫번째 입력했던값을 지우게됨(큰일남)
				break;
			}//if	
		}//for
		
		if(findOk == true){
			mdb.remove(position); //삭제
			System.out.println(removeMsg3);
			
			sb = new StringBuilder();
			for(SungJuk2VO s : mdb){
				sb.append(s.toString()).append("\n");
			}
			
			System.out.println(sb);
			
		}else{
			System.out.println(removeMsg4);
		} 
		
	}

}
